const express = require("express");
const router = express.Router();
const { User } = require("../../models");
const { Op } = require("sequelize");
const {
  BadRequestError,
  UnauthorizedError,
  NotFoundError,
} = require("../../utils/errors");
const { success, failure } = require("../../utils/responses");
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const validateCaptcha = require("../../middlewares/validate-captcha");
const { delKey } = require("../../utils/redis");

// const sendMail = require('../../utils/mail');
const { mailProducer } = require("../../utils/rabbit-mq");

/**
 * 管理员登录
 * POST /admin/auth/sign_in
 */
router.post("/sign_in", async (req, res) => {
  const { login, password } = req.body;

  try {
    if (!login) {
      throw new BadRequestError("邮箱/用户名必须填写。");
    }

    if (!password) {
      throw new BadRequestError("密码必须填写。");
    }

    const condition = {
      where: {
        [Op.or]: [{ email: login }, { username: login }],
      },
    };

    // 通过email或username，查询用户是否存在
    const user = await User.findOne(condition);
    if (!user) {
      throw new NotFoundError("用户不存在，无法登录。");
    }

    // 验证密码
    const isPasswordValid = bcrypt.compareSync(password, user.password);
    if (!isPasswordValid) {
      throw new UnauthorizedError("密码错误。");
    }

    // 验证是否管理员
    if (user.role !== 100) {
      throw new UnauthorizedError("您没有权限登录管理员后台。");
    }
    // 生成身份验证令牌
    const token = jwt.sign(
      {
        userId: user.id,
      },
      process.env.SECRET,
      { expiresIn: "30d" }
    );
    delete user.dataValues.password;
    success(res, "登录成功。", { token, user });
  } catch (error) {
    failure(res, error);
  }
});

/**
 * 用户注册
 * POST /auth/sign_up
 */
router.post("/sign_up", validateCaptcha, async function (req, res) {
  try {
    const body = {
      email: req.body.email,
      username: req.body.username,
      nickname: req.body.nickname,
      password: req.body.password,
      sex: 2,
      role: 0,
    };

    const user = await User.create(body);

    // ...
    // 请求成功，删除验证码，防止重复使用
    await delKey(req.body.captchaKey);

    // 发送邮件
    const html = `
  您好，<span style="color: red">${user.nickname}。</span><br><br>
  恭喜，您已成功注册会员！<br><br>
  请访问<a href="https://www.baidu.com">「晁阳」</a>官网，了解更多。<br><br>
  ━━━━━━━━━━━━━━━━<br>
  chaoyang<br> 
`;
    //  sendMail(user.email, '「长乐未央」的注册成功通知', html);

    // 将邮件发送请求放入队列
    const msg = {
      to: user.email,
      subject: "「长乐未央」的注册成功通知",
      html: `
  您好，<span style="color: red">${user.nickname}。</span><br><br>
  恭喜，您已成功注册会员！<br><br>
  请访问<a href="https://www.baidu.com">「晁阳」</a>官网，了解更多。<br><br>
  ━━━━━━━━━━━━━━━━<br>
  chaoyang<br> 
    `,
    };
    await mailProducer(msg);

    // 请求成功，删除验证码，防止重复使用
    await delKey(req.body.captchaKey);
    delete user.dataValues.password; // 删除密码
    success(res, "创建用户成功。", { user }, 201);
  } catch (error) {
    failure(res, error);
  }
});

module.exports = router;
